package com.simpleframe.views.chart;

import com.simpleframe.views.chart.attribution.*;




/**
 * 图表类
 * @author Administrator
 *
 */
public class Chart {

	/**
	 * 标题
	 */
	private ChartTitle title;

	/**
	 * 图表背景颜色 默认为白色
	 */
	private String bgColour;

	/**
	 * 数据的数组
	 */
	private ChartElements[] elements;
	
	/**
	 * 颜色数组的下标
	 */
	private int ColourGroupIndex;

	/**
	 * 横坐标
	 */
	private ChartXAxis xAxis;

	/**
	 * 纵坐标
	 */
	private ChartYAxis yAxis;

	/**
	 * 提示框
	 */
	private ChartTooltip tooltip;

	
	public Chart(ChartTitle title, String bgColour, ChartElements[] elements, ChartXAxis axis, ChartYAxis axis2,
			ChartTooltip tooltip) {
		super();
		this.title = title;
		this.bgColour = bgColour;
		this.elements = elements;
		ColourGroupIndex = 0;
		xAxis = axis;
		yAxis = axis2;
		this.tooltip = tooltip;
	}

	public Chart() {
		title = new ChartTitle();
		bgColour = new String(ChartColour.COLOUR_WHITE);
		elements = new ChartElements[0];
		xAxis = new ChartXAxis();
		yAxis = new ChartYAxis();
		ColourGroupIndex =0;
		tooltip = new ChartTooltip();
		DefaultSetting();
	}

	/**
	 * 获得本类对象的所有属性设置并返回一个字符串
	 * 
	 * @return
	 */
	public String getJsonString() {
		StringBuffer sb = new StringBuffer();
		sb.append("{\n");
		sb.append(title.getTitleString());
		sb.append(ChartTool.addQuotes("elements") + ":\n");
		sb.append("\t[\n");
		for (int i = 0; i < elements.length; i++) {
			if (i != elements.length - 1) {
				sb.append(elements[i].getElementString() + ",\n");
			} else {
				sb.append(elements[i].getElementString() + "\n");
			}
		}
		sb.append("\t],\n");
		sb.append(ChartTool.addQuotes("bg_colour") + ":");
		sb.append(ChartTool.addQuotes(bgColour) + ",\n");
		sb.append(xAxis.getXAxisString());
		sb.append(yAxis.getYAxisString());
		sb.append(tooltip.getTooltipString());
		sb.append("}");
		return sb.toString();
	}

	/**
	 * 设置图表标题名称
	 * 
	 * @param text
	 */
	public void setTitleText(String text) {
		title.setText(text);
	}

	/**
	 * 设置图表标题字体大小
	 * 
	 * @param fontSize
	 */
	public void setTitleFontSize(String fontSize) {
		title.getStyle().setFontSize(fontSize);
	}

	/**
	 * 设置图表标题颜色
	 * 
	 * @param colour
	 */
	public void setTitleColor(String color) {
		title.getStyle().setColor(color);
	}

	/**
	 * 设置标题的字体
	 * @param fontFamily
	 */
	public void setTitleFontFamily(String fontFamily) {
		title.getStyle().setFontFamily(fontFamily);
	}

	/**
	 * 设置标题的水平位置
	 * @param textAlign
	 */
	public void setTitleTextAlign(String textAlign) {
		title.getStyle().setTextAlign(textAlign);
	}

	/**
	 * 设置所有数据对象的显示类型
	 * 
	 * @param type
	 */
	public void setAllElementsType(String type) {
		for (int i = 0; i < elements.length; i++) {
			elements[i].setType(type);
		}
	}

	/**
	 * 设置所有数据对象的字体大小
	 * 
	 * @param fontSize
	 */
	public void setAllElementsFontSize(int fontSize) {
		for (int i = 0; i < elements.length; i++) {
			elements[i].setFontSize(fontSize);
		}
	}
	
	/**
	 * 设置所有数据的动画类型
	 * @param type
	 */
	public void setAllElementsOnShowType(String type){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getOnShow().setType(type);
		}
	}
	
	/**
	 * 设置所有数据的动画时长
	 * @param cascade
	 */
	public void setAllElementsOnShowCascade(double cascade){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getOnShow().setCascade(cascade);
		}
	}
	
	/**
	 * 设置所有数据的动画延时
	 * @param delay
	 */
	public void setAllElementsOnShowDelay(double delay){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getOnShow().setDelay(delay);
		}
	}
	
	/**
	 * 设置所有数据点的类型
	 * @param type
	 */
	public void setAllElementsDotType(String type){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setType(type);
		}
	}
	
	/**
	 * 设置所有数据点的颜色
	 * @param type
	 */
	public void setAllElementsDotColour(String colour){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setColour(colour);
		}
	}
	
	/**
	 * 设置所有数据点的大小
	 * @param dotSize
	 */
	public void setAllElementsDotSize(int dotSize){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setDotSize(dotSize);
		}
	}
	
	/**
	 * 设置所有数据多边形点的边数
	 * @param dotSize
	 */
	public void setAllElementsDotAnchorSizes(int sizes){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setSizes(sizes);
		}
	}
	
	/**
	 * 设置所有数据点的提示内容
	 * @param tip
	 */
	public void setAllElementsDotTip(String tip){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setTip(tip);
		}	
	}
	
	/**
	 * 设置所有数据点是否空心
	 * @param hollow true为空心，false为实心
	 */
	public void setAllElementsDotHollow(boolean hollow){
		for (int i = 0; i < elements.length; i++) {
			elements[i].getDotStyle().setHollow(hollow);
		}
	}

	/**
	 * 添加单一数据对象的属性
	 * @param colour
	 *            颜色
	 * @param text
	 *            名称
	 * @param value
	 *            值数组
	 */
	public void addSingleElement(String text, Number[] values){
		ChartElements[] tempElements = elements;
		elements = null;
		elements = new ChartElements[tempElements.length+1];
		for (int i = 0; i < tempElements.length; i++) {
			elements[i]=tempElements[i];
		}
		elements[elements.length-1]= new ChartElements();
		elements[elements.length-1].DefaultSetting();
		elements[elements.length-1].setColour(ChartColour.COLOURS[ColourGroupIndex]);
		elements[elements.length-1].getDotStyle().setColour(ChartColour.COLOURS[ColourGroupIndex++]);
		if(ColourGroupIndex>=ChartColour.COLOURS.length){
			ColourGroupIndex = 0;
		}
		elements[elements.length-1].setText(text);
		elements[elements.length-1].setValues(values);
	}

	/**
	 * 设置单一数据对象的透明度
	 * 
	 * @param Index
	 *            下标
	 * @param alpha
	 *            透明度
	 */
	public void setSingleElementAlpha(int Index, double alpha) {
		if (Index < 0 || Index >= elements.length) {
			System.out.println("Json.setSingleElementAlpha:Index越界");
			return;
		}
		if (alpha < 0 || alpha > 1.0) {
			elements[Index].setAlpha(1);
		} else {
			elements[Index].setAlpha(alpha);
		}
	}

	/**
	 * 设置单一数据对象的颜色
	 * 
	 * @param Index
	 *            下标
	 * @param colour
	 *            颜色
	 */
	public void setSingleElementColour(int Index, String colour) {
		if (Index < 0 || Index >= elements.length) {
			System.out.println("Json.setSingleElementColour:Index越界");
			return;
		}
		elements[Index].setColour(colour);
	}

	/**
	 * 设置单一数据对象的名称
	 * 
	 * @param Index
	 *            下标
	 * @param text
	 *            名称
	 */
	public void setSingleElementText(int Index, String text) {
		if (Index < 0 || Index >= elements.length) {
			System.out.println("Json.setSingleElementText:Index越界");
			return;
		}
		elements[Index].setText(text);
	}

	/**
	 * 设置单一数据对象的值
	 * 
	 * @param Index
	 *            下标
	 * @param value
	 *            值的数组
	 */
	public void setSingleElementValues(int Index, Number[] values) {
		if (Index < 0 || Index >= elements.length) {
			System.out.println("Json.setSingleElementValue():Index越界");
			return;
		}
		elements[Index].setValues(values);
	}
	
	/**
	 * 默认设定
	 */
	public void DefaultSetting() {
		title.DefaultSetting();
		for (int i = 0; i < elements.length; i++) {
			elements[i].DefaultSetting();
		}
		xAxis.DefaultSetting();
		yAxis.DefaultSetting();
		tooltip.DefaultSetting();
	}

	/**
	 * 设置数据提示框的颜色
	 * 
	 * @param colour
	 *            颜色
	 */
	public void setTooltipColour(String colour) {
		tooltip.setColour(colour);
	}

	/**
	 * 设置提示框宽度
	 * 
	 * @param stroke
	 */
	public void setTooltipStroke(int stroke) {
		tooltip.setStroke(stroke);
	}

	/**
	 * 设置提示框背景颜色
	 * 
	 * @param background
	 */
	public void setTooltipBackground(String background) {
		tooltip.setBackground(background);
	}

	/**
	 * 设置X轴的颜色
	 * 
	 * @param colour
	 */
	public void setXAxisColour(String colour) {
		xAxis.setColour(colour);
	}

	/**
	 * 设置X轴的横网格的颜色
	 * 
	 * @param gridColour
	 */
	public void setXAxisGridColour(String gridColour) {
		xAxis.setGridColour(gridColour);
	}

	/**
	 * 设置X轴的轴线宽度
	 * 
	 * @param stroke
	 */
	public void setXAxisStroke(int stroke) {
		xAxis.setStroke(stroke);
	}

	/**
	 * 设置X轴的轴刻度线高度值
	 * 
	 * @param tickHeight
	 */
	public void setXAxisTickHeight(int tickHeight) {
		xAxis.setTickHeight(tickHeight);
	}

	/**
	 * 设置X轴的是否显示3D效果
	 * 
	 * @param threeD
	 */
	public void setXAxisThreeD(int threeD) {
		xAxis.setThreeD(threeD);
	}
	
	/**
	 * 设置X轴的间距，若横坐标名称数少于7个，则全部显示；若大于7个则
	 * 只显示其中的7个坐标名称
	 * @param steps
	 */
	public void setXAxisSteps(){
		if(xAxis.getLabels()!=null){
			if(xAxis.getLabels().length<8){
				xAxis.setSteps(1);
			}else{
				xAxis.setSteps(xAxis.getLabels().length/7+1);
			}
		}else {
			System.out.println("Chart.setXAxisSteps():横坐标名称数组为空,设置间距失败");
		}
	}

	/**
	 * 设置X轴的坐标刻度的名称
	 * 
	 * @param labels
	 */
	public void setXAxisLabels(String[] labels) {
		xAxis.setLabels(labels);
	}

	/**
	 * 设置Y轴的颜色
	 * 
	 * @param colour
	 */
	public void setYAxisColour(String colour) {
		yAxis.setColour(colour);
	}

	/**
	 * 设置Y轴的横网格的颜色
	 * 
	 * @param gridColour
	 */
	public void setYAxisGridColour(String gridColour) {
		yAxis.setGridColour(gridColour);
	}

	/**
	 * 设置Y轴的轴线宽度
	 * 
	 * @param stroke
	 */
	public void setYAxisStroke(int stroke) {
		yAxis.setStroke(stroke);
	}

	/**
	 * 设置Y轴的轴刻度线高度值
	 * 
	 * @param tickHeight
	 */
	public void setYAxisTickHeight(int tickHeight) {
		yAxis.setTickHeight(tickHeight);
	}
	
	/**
	 * 设置Y轴的最小值
	 * @param min
	 */
	public void setYAxisMin(double min) {
		yAxis.setMin(min);
	}

	/**
	 * 根据元素的value数组的值，设置Y轴的最大值
	 * @param max
	 */
	public void setYAxisMax() {
		Number maxTemp = yAxis.getMax();
		Number[] doubleTemp= new Number[elements.length];
		for (int i = 0; i < elements.length; i++) {
			doubleTemp[i] = ChartTool.getMaxNumber(elements[i].getValues().clone());
		}
		maxTemp = ChartTool.getMaxNumber(doubleTemp).doubleValue()+yAxis.getSteps();
		yAxis.setMax(maxTemp.doubleValue());
	}

	/**
	 * 设置Y轴的梯度值
	 * @param steps
	 */
	public void setYAxisSteps(double steps) {
		yAxis.setSteps(steps);
	}
	
	/**
	 * 设置Y轴的梯度值为Y轴最大值的5份之一
	 * @param steps
	 */
	public void setYAxisSteps() {
		yAxis.setSteps(yAxis.getMax()/5);
	}

	/**
	 * 以下为属性的get和set方法
	 * 
	 * @return
	 */

	public ChartTitle getTitle() {
		return title;
	}

	public void setTitle(ChartTitle title) {
		this.title = title;
	}

	public String getBgColour() {
		return bgColour;
	}

	/**
	 * 设置图表背景颜色
	 * @param bgColour
	 */
	public void setBgColour(String bgColour) {
		this.bgColour = bgColour;
	}

	public ChartElements[] getElements() {
		return elements;
	}

	public void setElements(ChartElements[] elements) {
		this.elements = elements;
	}

	public ChartXAxis getXAxis() {
		return xAxis;
	}

	public void setXAxis(ChartXAxis axis) {
		xAxis = axis;
	}

	public ChartYAxis getYAxis() {
		return yAxis;
	}

	public void setYAxis(ChartYAxis axis) {
		yAxis = axis;
	}

	public ChartTooltip getTooltip() {
		return tooltip;
	}

	public void setTooltip(ChartTooltip tooltip) {
		this.tooltip = tooltip;
	}

}
